<?php #Генерация аттачей
class attaches extends Load_use
{
	/*Порядковый номер аттача глобален для всех аттачаей внутри страницы*/
	private $zin=0;
	private $count_attaches=0;
	private $types=array('file','field','block');
	private $base_attaches=array();
	function getBlockForm()
	{
		$block_name=$this->getParam('block_name',false);
		$field_name=$this->getParam('field_name',false);
		if($block_name && $field_name)
			return $this->block(false,false,$field_name,$block_name,true);
		return false;
	}
	private function file($selected,$params,$field_name)
	{
		$params['selected_files'] = $selected;
		$params['name'] = $field_name;
		$params['button_disabled'] = true;
		return $this->load->block('select_file',$params);
	}
	private function field($field_data,$params,$field_name)
	{
		if($field_data)
			$params['val']=count($field_data)>1?$field_data:array_shift($field_data);		
		$params['readonly']=true;
		$params['name']=$field_name.'[]';
		return $this->load->block('form_element',$params);
	}
	private function block($field_data,$params,$field_name,$block_name,$delete_button=false)
	{
		/*Гружу кеш настроек блоков*/
		$blocks_defaults=$this->cache->get('admin/attach_block_params','get_comment_params','block');	
		if(isset($blocks_defaults[$block_name]))
		{							
			$block='';
			/*Относительное расположение*/
			if(isset($blocks_defaults[$block_name]['position']))
			{
				/*Список возможных расположений на странице*/
				$pos_param=array('type'=>'select','readonly'=>true,'name'=>$field_name.'[position]','values'=>$GLOBALS['BLOCKS_POSITIONS']);
				/*Значение из базы*/
				if(!empty($field_data['position']))
					$pos_param['val']=$field_data['position'];
				$block.='<div class="field">
				<div class="desc">Относительное расположение</div>'
					.$this->load->block('form_element',$pos_param)
				.'</div>';
			}
			/*Дополнительные поля настроек блока*/	
			if(isset($blocks_defaults[$block_name]['fields']))
			{
				foreach($blocks_defaults[$block_name]['fields'] as $block_param_name=>$p)
				/*Если в шаблоне не исключены параметры блока (для общего значения для всех страниц шаблона)*/
				if(!$params || !in_array($block_param_name,$params))
				{
					$data=false;
					$func=isset($p['type'])&&$p['type']=='file'?'file':'field';
					$block_field_name=$field_name.'['.$block_param_name.']';					
					$data=isset($field_data[$block_param_name])?$field_data[$block_param_name]:false;
					/*Вывод как блока - с загловком для разделения полей принадлежащих оному*/
					$block.='<div class="field">
					<div class="desc">'.$p['title'].'</div>'
						.$this->$func($data,$p,$block_field_name)
					.'</div>';
				}
			}							
			if(!empty($block))
				$block='<div class="clear">
				</div><div class="block">
				<div class="title"><span>'.(isset($blocks_defaults[$block_name]['title'])?$blocks_defaults[$block_name]['title']:$block_name).'</span>'.($delete_button?'<span class="delete disabled" onclick="page_editor.deleteBlock(this,\''.str_replace('val','delete',$field_name).'\')">X</span>':'').'</div>'
					.$block
				.'</div>';
			return $block;
		}
		else $this->add_log('NOT IN DEFAULTS'.$block_name,DEE_ERROR);
	}
	function getAttaches()
	{
		/*Проверяю обязательные параметры*/
		if(!isset($this->params['attaches']))
			return false;
		/*Список аттачей из настроек шаблона*/
		$attaches_list=$this->params['attaches'];
		$page_id=$this->getParam('page_id',false);
		/*Не добавлять */
		$only_templ=$this->getParam('only_templ',false);
		
		/*POST данные*/
		$in_post=!$this->getParam('clear',false) && isset($_POST['page_edit']['attaches'])?$_POST['page_edit']['attaches']:false;
		
		/*Массивы для объединения трех массив : Настройки шаблона, Post и сохраненные в базе*/
		$grand_ids=$grand_arr=array();
		/*Если передан идентификатор страницы то ищу в базе аттачи для нее*/
		if($page_id)
		{
			if(!isset($this->base_attaches[$page_id]))
			{
				$this->conn->query("select * from pages_attachments where page_id={$page_id} order by zin");
				while($row=$this->conn->fetch())
				{
						$grand_ids[$row->type][$row->name]=$row->id;
						$grand_arr[$row->id]=array('type'=>$row->type,'name'=>$row->name,'in_templ'=>false,'in_post'=>false,'in_base'=>unserialize($row->params));
				}
				$this->base_attaches[$page_id]=array('ids'=>$grand_ids,'arr'=>$grand_arr);
			}else
			{
				$grand_ids=$this->base_attaches[$page_id]['ids'];
				$grand_arr=$this->base_attaches[$page_id]['arr'];
			}			
		}
		
		/*Сопоставляю данные с данными базы*/
		if($in_post)
		{
			foreach($in_post as $id=>$row)
			if(isset($row['type']) && isset($row['name']))
			{
				if($row['type']=='block' && !empty($row['val']))
				{
					$val=array();
					foreach($row['val'] as $ind=>$v)
						if(!empty($v))
							$val[$ind]=$v;
					$row['val']=$val;
				}
				$val= empty($row['val'])?false:$row['val'];
				$n_id=(is_numeric($id))?$id:'po'.$this->count_attaches++;
				if(isset($grand_arr[$n_id]))
				{
					if(!$val)
						$grand_arr[$n_id]['in_base']=false;
					$grand_arr[$n_id]['in_post']=$val;
				}
				else
				{
					
					$grand_ids[$row['type']][$row['name']]=$n_id;
					$grand_arr[$n_id]=array('type'=>$row['type'],'name'=>$row['name'],'in_templ'=>false,'in_post'=>$val,'in_base'=>false);
					
				}
				if(isset($row['delete']))
					$grand_arr[$n_id]['delete']=true;
			}				
		}
		/*Сопоставляю, добавляю необходимые аттачи*/
		foreach($attaches_list as $row)
		{
			if(isset($grand_ids[$row['type']][$row['name']]))
			{
				$grand_arr[$grand_ids[$row['type']][$row['name']]]['in_templ']=$row;
				unset($grand_ids[$row['type']][$row['name']]);
			}
			else
			{
				$grand_arr['tm'.$this->count_attaches++]=array('type'=>$row['type'],'name'=>$row['name'],'in_templ'=>$row,'in_post'=>false,'in_base'=>false);
			}
								
		}		
		$blocks=$res='';
		foreach($grand_arr as $field_id=>$attach)
		{
			$type=$attach['type'];
			if(($attach['in_templ']||!$only_templ) && in_array($type,$this->types))
			{
				$block_name=$name=mysql_escape_string($attach['name']);
				$field_name='page_edit[attaches]['.$field_id.'][val]';
				$params=false;
				$good=true;
				$field_data=$attach['in_post']?$attach['in_post']:($attach['in_base']?$attach['in_base']:false);
				if($attach['in_templ'])//Необходим по шаблону
				{
					$params=isset($attach['in_templ']['params'])?$attach['in_templ']['params']:array();
					if(isset($attach['in_templ']['block_name']))
						$block_name=mysql_escape_string($attach['in_templ']['block_name']);
				}/*Уникально для каждой страницы, не из шаблона может быть только блок или файлы CSS и JS*/
				elseif($type!='block')
					$good=false;
				if($good)
				{
					if($in_post && $page_id)
					{
						if($type=='file'&& !empty($field_data))
						{
							$data=array();
							foreach($field_data as $val)
								$data[]=$val;
							$field_data=$data;
						}
						$field_val=empty($field_data)?false:mysql_escape_string(serialize($field_data));
						if(is_numeric($field_id))
						{
							if(isset($attach['delete']))//Удалить
								$this->conn->query("delete from pages_attachments where id=$field_id");
							else//Обновить
								$this->conn->query("update pages_attachments set params='$field_val' ,zin={$this->zin} where id=$field_id");
						}
						elseif($field_val)//добавить если не пустое значение
							$this->conn->query("insert into pages_attachments (type,name,page_id,params,zin)values('$type','$name',{$page_id},'$field_val',{$this->zin})");
							
						$this->zin++;
					}
					$hid='<input type="hidden" name="page_edit[attaches]['.$field_id.'][type]" value="'.$type.'" /><input type="hidden" name="page_edit[attaches]['.$field_id.'][name]" value="'.$name.'" />';
					if($type=='block')
						$blocks.=$this->$type($field_data,$params,$field_name,$block_name,$attach['in_templ']?false:true).$hid;
					else
					$res.='<div class="field '.$name.($type=='file' && !$field_data?' empty':'').'">
					<div class="desc">'.$attach['in_templ']['desc'].'</div>'
						.$this->$type($field_data,$params,$field_name)
						.$hid
					.'</div>';
				}
			}
			
		}
	return $res.$blocks;		
	}
}
